home *** CD-ROM | disk | FTP | other *** search
/ Assassins - Ultimate CD Games Collection 4 / Assassins 4 (1999)(Weird Science).iso / misc / omega / source / itemf2.c < prev    next >
C/C++ Source or Header  |  1997-05-02  |  12KB  |  588 lines

  1. /* omega copyright (C) 1987,1988,1989 by Laurence Raphael Brothers */
  2. /* itemf2.c */
  3.  
  4. /* mostly ring, armor, and weapon functions */
  5.  
  6. #include "glob.h"
  7.  
  8.  
  9.  
  10.  
  11. /* ring functions */
  12. void i_perm_knowledge(o)
  13. pob o;
  14. {
  15.   if (o->known < 1)
  16.     o->known = 1;
  17.   if (o->blessing > -1)
  18.     Objects[o->id].known = 1;
  19.   if (o->used) 
  20.     knowledge(o->blessing);
  21. }
  22.  
  23. void i_perm_strength(o)
  24. pob o;
  25. {
  26.   if (o->known < 1) o->known = 1;
  27.   Objects[o->id].known = 1;
  28.   if (o->used){
  29.     if (o->blessing > -1)
  30.       Player.str += abs(o->plus)+1;
  31.     else
  32.       Player.str -= abs(o->plus)+1;
  33.   }
  34.   else {
  35.     if (o->blessing > -1)
  36.       Player.str -= abs(o->plus)+1;
  37.     else
  38.       Player.str += abs(o->plus)+1;
  39.   }
  40.   calc_melee();
  41. }
  42.  
  43.  
  44.  
  45. void i_perm_burden(o)
  46. pob o;
  47. {
  48.   int i;
  49.   
  50.   if (o->used) {
  51.     o->weight = 1000;
  52.     mprint("You feel heavier.");
  53.   }
  54.   else {
  55.     o->weight = 1;
  56.     mprint("Phew. What a relief.");
  57.   }
  58.   Player.itemweight = 0;
  59.   for (i=0;i<MAXITEMS;i++) {
  60.     if (Player.possessions[i] != NULL)
  61.       Player.itemweight += 
  62.     (Player.possessions[i]->weight*Player.possessions[i]->number);
  63.   }
  64. }
  65.  
  66. void i_perm_gaze_immune(o)
  67. pob o;
  68. {
  69.   if (o->used) Player.immunity[GAZE]++;
  70.   else Player.immunity[GAZE]--;
  71. }
  72.  
  73. void i_perm_fire_resist(o)
  74. pob o;
  75. {
  76.   if (o->used) Player.immunity[FLAME]++;
  77.   else Player.immunity[FLAME]--;
  78. }
  79.  
  80. void i_perm_poison_resist(o)
  81. pob o;
  82. {
  83.   if (o->used) {
  84.     if (o->blessing < 0) {
  85.       Player.immunity[POISON] = 0;
  86.       p_poison(100);
  87.     }
  88.     else {
  89.       Player.immunity[POISON]++;
  90.       if (Player.status[POISONED] > 0) {
  91.     mprint("You feel much better now.");
  92.     Player.status[POISONED] = 0;
  93.       }
  94.     }
  95.   }
  96.   else {
  97.     Player.status[POISONED] = 0;
  98.     Player.immunity[POISON]--;
  99.   }
  100. }
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107. void i_perm_regenerate(o)
  108. pob o;
  109. {
  110.   if (o->known < 1)  o->known = 1;
  111.   if (o->blessing > -1)
  112.     Objects[o->id].known = 1;
  113.   if (o->used) {
  114.     mprint("You seem abnormally healthy.");
  115.     Player.status[REGENERATING] += 1500;
  116.   }
  117.   else {
  118.     Player.status[REGENERATING] -= 1500;
  119.     if (Player.status[REGENERATING] < 1) {
  120.       mprint("Your vitality is back to normal");
  121.       Player.status[REGENERATING] = 0;
  122.     }
  123.   }
  124. }
  125.  
  126.  
  127.  
  128.  
  129. /* armor functions */
  130.  
  131.  
  132. void i_normal_armor(o)
  133. pob o;
  134. {
  135.   if (o->used) mprint("You put on your suit of armor.");
  136. }
  137.  
  138. void i_perm_energy_resist(o)
  139. pob o;
  140. {
  141.   if (o->used){
  142.     Player.immunity[FLAME]++;
  143.     Player.immunity[COLD]++;
  144.     Player.immunity[ELECTRICITY]++;
  145.   }
  146.   else {
  147.     Player.immunity[FLAME]--;
  148.     Player.immunity[COLD]--;
  149.     Player.immunity[ELECTRICITY]--;
  150.   }
  151. }
  152.  
  153.  
  154.  
  155. void i_perm_fear_resist(o)
  156. pob o;
  157. {
  158.   if (o->used){
  159.     Player.immunity[FEAR]++;
  160.     if (o->blessing < 0) {
  161.       Player.status[BERSERK] += 1500;
  162.       mprint("You feel blood-simple!");
  163.     }
  164.   }
  165.   else {
  166.     Player.immunity[FEAR]--;
  167.     if (o->blessing < 0) {
  168.       Player.status[BERSERK] -= 1500;
  169.       if (Player.status[BERSERK] < 1) {
  170.     mprint("You feel less rabid now.");
  171.       Player.status[BERSERK] = 0;
  172.       }
  173.     }
  174.   }
  175. }    
  176.  
  177.  
  178.  
  179. void i_perm_breathing(o)
  180. pob o;
  181. {
  182.   if (o->known < 1)  o->known = 1;
  183.   if (o->blessing > -1)
  184.     Objects[o->id].known = 1;
  185.  
  186.   if (o->blessing > -1) {
  187.     if (o->used) {
  188.       mprint("Your breath is energized!");
  189.       Player.status[BREATHING] += 1500;
  190.     }
  191.     else  {
  192.       Player.status[BREATHING] -= 1500;
  193.       if (Player.status[BREATHING] < 1) {
  194.     mprint("Your breathing is back to normal.");
  195.     Player.status[BREATHING] = 0;
  196.       }
  197.     }
  198.   }
  199.   else if (o->used) {
  200.     Player.status[BREATHING] = 0;
  201.     p_drown();
  202.     print1("Water pours from the broken suit.");
  203.   }
  204. }
  205.  
  206.  
  207.  
  208. /* weapons functions */
  209.  
  210. void weapon_acidwhip(dmgmod,o,m)
  211. int dmgmod;
  212. pob o;
  213. struct monster *m;
  214. {
  215.   if ((random_range(2) == 1) && (! m_immunityp(m,NORMAL_DAMAGE))) {
  216.     mprint("You entangle the monster!");
  217.     m_status_reset(m,MOBILE);
  218.   }
  219.   p_hit(m,Player.dmg+dmgmod,ACID);
  220.  
  221. }
  222.  
  223. void weapon_scythe(dmgmod,o,m)
  224. int dmgmod;
  225. pob o;
  226. struct monster *m;
  227. {
  228.   mprint("Slice!");
  229.   m_death(m);
  230.   if (! Player.rank[ADEPT]) {
  231.     mprint("Ooops!");
  232.     mprint("You accidentally touch yourself on the backswing....");
  233.     p_death("the Scythe of Death");
  234.   }
  235. }
  236.  
  237. void weapon_demonblade(dmgmod,o,m)
  238. int dmgmod;
  239. pob o;
  240. struct monster *m;
  241.   if (o->blessing > -1) {
  242.     mprint("Demonblade disintegrates with a soft sigh.");
  243.     mprint("You stop foaming at the mouth.");
  244.     Player.status[BERSERK] = 0;
  245.     conform_lost_object(o);
  246.   }
  247.   else if (m->specialf == M_SP_DEMON) {
  248.     mprint("The demon flees in terror before your weapon!");
  249.     m_vanish(m);
  250.   }
  251.   else if (m->meleef != M_MELEE_SPIRIT) {
  252.     if (m->level > random_range(10)) {
  253.       Player.hp = min(Player.maxhp,Player.hp+m->hp);
  254.       Player.str++;
  255.       Player.pow = min(Player.maxpow,Player.pow+m->level);
  256.       m_death(m);
  257.       mprint("You feel a surge of raw power from Demonblade!");
  258.     }
  259.     else p_hit(m,Player.dmg+dmgmod,NORMAL_DAMAGE);
  260.  
  261.   }
  262.   else {
  263.     mprint("Demonblade howls as it strikes the spirit!");
  264.     if (random_range(10) == 1) {
  265.       mprint("... and shatters into a thousand lost fragments!");
  266.       morewait();
  267.       p_damage(50,UNSTOPPABLE,"Demonblade exploding");
  268.       conform_lost_object(o);
  269.     }
  270.     else {
  271.       mprint("You feel your lifeforce draining....");
  272.       p_damage(25,UNSTOPPABLE,"a backlash of negative energies");
  273.       Player.str -= 3;
  274.       Player.con -= 3;
  275.       if (Player.str < 1 || Player.con < 1)
  276.     p_death("a backlash of negative energies");
  277.     }
  278.   }
  279. }
  280.  
  281. void weapon_lightsabre(dmgmod,o,m)
  282. int dmgmod;
  283. pob o;
  284. struct monster *m;
  285. {
  286.   if (! o->known) {
  287.     mprint("Fumbling with the cylinder, you press the wrong stud....");
  288.     p_damage(100,UNSTOPPABLE,"fumbling with a lightsabre");
  289.     o->known = 1;
  290.   }
  291.   else {
  292.     /* test prevents confusing immunity messages.... */
  293.     if (! m_immunityp(m,NORMAL_DAMAGE)) {
  294.       mprint("Vzzzzmmm!");
  295.       m_damage(m,20,NORMAL_DAMAGE);
  296.     }
  297.     if ((m->hp>0) && (! m_immunityp(m,FLAME))) {
  298.       mprint("Zzzzap!");
  299.       m_damage(m,20,FLAME);
  300.     }
  301.   }
  302. }
  303.  
  304. void weapon_tangle(dmgmod,o,m)
  305. int dmgmod;
  306. pob o;
  307. struct monster *m;
  308. {
  309.   if ((random_range(2) == 1) && (! m_immunityp(m,NORMAL_DAMAGE))) {
  310.     mprint("You entangle the monster!");
  311.     m_status_reset(m,MOBILE);
  312.   }
  313.   p_hit(m,Player.dmg+dmgmod,NORMAL_DAMAGE);
  314. }
  315.  
  316. /* if wielding a bow, add bow damage to arrow damage */
  317. void weapon_arrow(dmgmod,o,m)
  318. int dmgmod;
  319. pob o;
  320. struct monster *m;
  321. {
  322.   if ((Player.possessions[O_WEAPON_HAND] != NULL) &&
  323.       (Player.possessions[O_WEAPON_HAND]->id == WEAPONID+26)) /* ie, using a bow */
  324.     p_hit(m,Player.dmg+o->plus+o->dmg+dmgmod,NORMAL_DAMAGE);
  325.   else p_hit(m,o->plus+o->dmg+dmgmod,NORMAL_DAMAGE);
  326. }
  327.  
  328. /* if wielding a crossbow, add bow damage to arrow damage */
  329. void weapon_bolt(dmgmod,o,m)
  330. int dmgmod;
  331. pob o;
  332. struct monster *m;
  333. {
  334.   if ((Player.possessions[O_WEAPON_HAND] != NULL) &&
  335.       (Player.possessions[O_WEAPON_HAND]->id == WEAPONID+27) && /*ie using a crossbow */
  336.       (Player.possessions[O_WEAPON_HAND]->aux==LOADED)) {
  337.     p_hit(m,Player.dmg+o->plus+o->dmg+dmgmod,NORMAL_DAMAGE);
  338.     Player.possessions[O_WEAPON_HAND]->aux = UNLOADED;
  339.       }
  340.   else p_hit(m,o->plus+o->dmg,NORMAL_DAMAGE);
  341. }
  342.  
  343.  
  344. void weapon_mace_disrupt(dmgmod,o,m)
  345. int dmgmod;
  346. pob o;
  347. struct monster *m;
  348. {
  349.   if (m->meleef == M_MELEE_SPIRIT) {
  350.     mprint("The monster crumbles away to dust!");
  351.     m_death(m);
  352.   }
  353.   else p_hit(m,Player.dmg+dmgmod,UNSTOPPABLE);
  354. }
  355.  
  356. void weapon_normal_hit(dmgmod,o,m)
  357. int dmgmod;
  358. pob o;
  359. struct monster *m;
  360. {
  361.   p_hit(m,Player.dmg+dmgmod,NORMAL_DAMAGE);
  362. }
  363.  
  364.  
  365. /* will be updated eventually */
  366. void weapon_bare_hands(dmgmod,m)
  367. int dmgmod;
  368. struct monster *m;
  369. {
  370.   p_hit(m,Player.dmg+dmgmod,NORMAL_DAMAGE);
  371. }
  372.  
  373.  
  374. void i_demonblade(o)
  375. pob o;
  376. {
  377.   if (o->used) {
  378.     o->known = 2;
  379.     mprint("Demonblade's fangs open and bury themselves in your wrist!");
  380.     mprint("You hear evil laughter in the distance....");
  381.     mprint("You begin to foam at the mouth!");
  382.     Player.status[BERSERK] = 1500;
  383.   }
  384.   else {
  385.     mprint("You hear a sound like a demon cursing.");
  386.     mprint("You feel less like biting your shield.");
  387.     Player.status[BERSERK] = 0;
  388.   }
  389. }
  390.  
  391. void i_normal_weapon(o)
  392. pob o;
  393. {
  394.   if (o->used) mprint("You ready your weapon for battle.");
  395. }
  396.  
  397. void i_lightsabre(o)
  398. pob o;
  399. {
  400.   if (o->used) mprint("You feel one with the Force.");
  401.   else mprint("You feel out of touch with the Force.");
  402. }
  403.  
  404. void i_mace_disrupt(o)
  405. pob o;
  406. {
  407.   mprint("That's a damned heavy mace!");
  408. }
  409.  
  410.  
  411.  
  412. void weapon_vorpal(dmgmod,o,m)
  413. int dmgmod;
  414. pob o;
  415. struct monster *m;
  416. {
  417.   if ((random_range(10) < 3) && (! m_immunityp(m,NORMAL_DAMAGE))) {
  418.     o->known = 2;
  419.     if (random_range(2) == 1)
  420.       mprint("One Two! One Two! And through and through!");
  421.     else mprint("Your vorpal blade goes snicker-snack!");
  422.     m_death(m);
  423.   }
  424.   else weapon_normal_hit(dmgmod,o,m);
  425. }
  426.  
  427. void weapon_desecrate(dmgmod,o,m)
  428. int dmgmod;
  429. pob o;
  430. struct monster *m;
  431. {
  432.   o->known = 2;
  433.   if (Player.alignment < 0) {
  434.     mprint("Your opponent screams in agony!");
  435.     p_hit(m,Player.dmg+dmgmod,UNSTOPPABLE);
  436.     Player.alignment--;
  437.     if (Player.hp < Player.maxhp) {
  438.       mprint("You feel a thrill of power surging up your blade!");
  439.       Player.hp = min(Player.maxhp,Player.hp+Player.dmg+dmgmod);
  440.     }
  441.   }
  442.   else {
  443.     mprint("Your blade turns in your hands and hits you!");
  444.     mprint("You hear evil laughter....");
  445.     level_drain(Player.dmg,"the sword Desecrator");
  446.     Player.alignment-=10;
  447.     mprint("A strange force spreads from the wound throughout your body...");
  448.     mprint("You feel much more chaotic now.");
  449.   }
  450. }
  451.  
  452.  
  453.  
  454. void weapon_firestar(dmgmod,o,m)
  455. int dmgmod;
  456. pob o;
  457. struct monster *m;
  458. {
  459.   if (random_range(3) == 1) {
  460.     o->known = 2;
  461.     fball(Player.x,Player.y,Player.x,Player.y,max(Player.dmg,25));
  462.   }
  463.   if (m->hp > 0) weapon_normal_hit(dmgmod,o,m);
  464. }
  465.  
  466. void weapon_defend(dmgmod,o,m)
  467. int dmgmod;
  468. pob o;
  469. struct monster *m;
  470. {
  471.   if ((Player.alignment < 0) && (o->blessing > 0)) {
  472.       mprint("The Holy Defender screams in your hands....");
  473.       mprint("You stagger before the sound of its rage....");
  474.       p_damage(50,UNSTOPPABLE,"a pissed-off Holy Defender");
  475.       mprint("The weapon finally quiets. It seems less holy now.");
  476.       o->truename = o->cursestr;
  477.       Player.status[PROTECTION] -= (o->hit);
  478.       o->plus = 0-abs(o->plus);
  479.       o->blessing = -1;
  480.     }
  481.   if ((o->blessing > 0) &&
  482.       ((m->specialf == M_SP_DEMON) ||
  483.        (m->meleef == M_MELEE_SPIRIT))) {
  484.     mprint("Your opponent shies back before your holy weapon!");
  485.     m->hit = 0;
  486.     m->speed *=2;
  487.   }
  488.   weapon_normal_hit(dmgmod,o,m);
  489. }
  490.  
  491. void weapon_victrix(dmgmod,o,m)
  492. int dmgmod;
  493. pob o;
  494. struct monster *m;
  495. {
  496.   if (m->meleef == M_MELEE_SPIRIT) {
  497.     mprint("Your opponent dissipates in a harmless cloud of vapors...");
  498.     m_death(m);
  499.   }
  500.   else weapon_normal_hit(dmgmod,o,m);
  501. }
  502.  
  503. void i_defend(o)
  504. pob o;
  505. {
  506.   o->known = 2;
  507.   if (o->used) {
  508.     mprint("You feel under an aegis!");
  509.     Player.status[PROTECTION] += o->hit;
  510.   }
  511.   else Player.status[PROTECTION] -= o->hit;
  512. }
  513.  
  514.  
  515. void i_victrix(o)
  516. pob o;
  517. {
  518.   o->known = 2;
  519.   o->blessing = abs(o->blessing);
  520.   if (o->used) {
  521.     Player.immunity[POISON]++;
  522.     Player.immunity[FEAR]++;
  523.     Player.immunity[INFECTION]++;
  524.   }
  525.   else {
  526.     Player.immunity[POISON]--;
  527.     Player.immunity[FEAR]--;
  528.     Player.immunity[INFECTION]--;
  529.   }
  530. }    
  531.  
  532.  
  533. void i_desecrate(o)
  534. pob o;
  535. {
  536.   if (o->known < 1)  o->known = 2;
  537.   if (o->blessing > 0) {
  538.     mprint("How weird, a blessed desecrator... ");
  539.     mprint("The structure of reality cannot permit such a thing....");
  540.     dispose_lost_objects(1,o);
  541.   }
  542.   else if (Level->site[Player.x][Player.y].locchar == ALTAR)
  543.     sanctify(-1);
  544. }
  545.  
  546.  
  547. /* shield functions */
  548. void i_normal_shield(o)
  549. pob o;
  550. {
  551.   if (o->used) mprint("You sling your shield across a forearm.");
  552. }
  553.  
  554.  
  555. void i_perm_deflect(o)
  556. pob o;
  557. {
  558.   if (o->known < 1)  o->known = 2;
  559.   if (o->blessing > -1) {
  560.     if (o->used) {
  561.       mprint("You feel buffered.");
  562.       Player.status[DEFLECTION] += 1500;
  563.     }
  564.     else {
  565.       Player.status[DEFLECTION] -= 1500;
  566.       if (Player.status[DEFLECTION] < 1) {
  567.     mprint("You feel less defended");
  568.     Player.status[DEFLECTION] = 0;
  569.       }
  570.     }
  571.   }
  572.   else {
  573.     if (o->used) {
  574.       mprint("You feel naked.");
  575.       Player.status[VULNERABLE] += 1500;
  576.       Player.status[DEFLECTION] = 0;
  577.     }
  578.     else {
  579.       Player.status[VULNERABLE] -= 1500;
  580.       if (Player.status[VULNERABLE] < 1) {
  581.     mprint("You feel less vulnerable");
  582.     Player.status[VULNERABLE] = 0;
  583.       }
  584.     }
  585.   }
  586. }
  587.